[1]:
from IPython.display import IFrame
# Youtube
IFrame("https://www.youtube.com/embed/v-91XHpjugo", "100%", 500)
[1]:
Configurações¶
[2]:
import numpy as np
import pandas as pd
from scipy.integrate import odeint
from bokeh.palettes import brewer
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
output_notebook()
Suscetível, Infectado e Removido (Recuperado)¶
A proposta é introduzir um modelo determinístico para análise de evolução de uma epidemia. O modelo aqui representado foi inicialmente proposto por Kermack, W. and McKendrick, A., 1927. A contribution to the mathematical theory of epidemics. Proc. R. Soc. London A 115, 700-721. O modelo tem as seguintes premissas:
- Uma posulação invariante no tempo com N individuos (fechada).
- Taxas constantes: contato e remoção.
- Desconsiderando variações demográficas: nascimentos e mortes.
- População “bem misturada”.
O modelo é fundamentado em três estados: S - suscetível, I - infectado e R - removido ou recuperado.
\[S(t)+I(t)+R(t)= N\]
[3]:
# Tamanho da populção - N
N = 500
# Valores iniciais
I0 = 1
R0 = 0
S0 = N - I0
O conjunto de equações diferenciais que caracteriza o modelo é descrito abaixo. No modelo
\[\beta - \text{representa a taxa de transmissão ou taxa efetiva de contato}\]
e
\[r - \text{a taxa de remoção ou recuperação.}\]
\[\begin{split}\begin{split}
\frac{dS(t)}{dt} & = -\beta S(t) I(t) \\
\frac{dI(t)}{dt} & = \beta S(t) I(t) - rI(t) \\
\frac{dR(t)}{dt} & = r I(t)
\end{split}\end{split}\]
[4]:
# Definição do conjunto de equações diferencias não lineares que formam o modelo.
def SIRm(y, t, N, Beta, r):
S, I, R = y
Sdot = -(Beta * S * I)
Idot = (Beta * S * I) - r * I
Rdot = r * I
return Sdot, Idot, Rdot
Analisando a evolução de \(\beta\) e \(r\)¶
[5]:
# Beta - taxa de contato,
# r - taxa média de recuperação (in 1/dia).
Beta = 0.0009
r = 1e-1
# Resolução da simulação - Escala temporal (dias)
t = np.linspace(0, 100, 1000)
# Vetor de condições iniciais
y0 = S0, I0, R0
# Integrando as Equações do modelo SIR
ret = odeint(SIRm, y0, t, args=(N, Beta, r))
S, I, R = ret.T
# Visualizando a evolução da Epidemia - S(t), I(t) e R(t)
p = figure(tools="pan,hover,lasso_select",
x_range=(0, t[-1]), y_range=(0, N),
plot_width=600, plot_height=400)
p.line(t, S, legend_label="Suscetíveis", color="#ffd885", line_width=3)
p.line(t, I, legend_label="Infectados", color="#de425b", line_width=3)
p.line(t, R, legend_label="Removidos", color="#99d594", line_width=3)
p.grid.grid_line_alpha = 0
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
p.yaxis.axis_label = "Indivíduos"
p.xaxis.axis_label = "Dias"
p.legend.click_policy = "mute"
p.legend.items.reverse()
show(p)
Salvando o modelo¶
[6]:
import pandas as pd
output = pd.DataFrame({"S": S, "I": I, "R": R})
output.to_csv('SIRpd', index=False)
print(output)
S I R
0 499.000000 1.000000 0.000000
1 498.954252 1.035561 0.010187
2 498.906883 1.072381 0.020736
3 498.857833 1.110506 0.031660
4 498.807046 1.149981 0.042973
.. ... ... ...
995 5.855617 0.232760 493.911622
996 5.855495 0.230564 493.913941
997 5.855374 0.228388 493.916238
998 5.855254 0.226232 493.918514
999 5.855135 0.224097 493.920768
[1000 rows x 3 columns]